home *** CD-ROM | disk | FTP | other *** search
/ ASME's Mechanical Engine…ing Toolkit 1997 December / ASME's Mechanical Engineering Toolkit 1997 December.iso / c_lang / duncan01.lzh / SHELL.C next >
Text File  |  1987-08-11  |  2KB  |  115 lines

  1. #include <stdio.h>
  2. #include <process.h>
  3. #include <stdlib.h>
  4. #include <signal.h>
  5. #include <string.h>
  6.  
  7. #define dim(x) (sizeof(x)/sizeof(x[0]))
  8.  
  9. typedef enum {false = 0,true = !false} boolean;
  10.  
  11. /* You may have to change these function prototypes a little. */
  12. /*   Or maybe not... */
  13.  
  14. int intrinsic(char *);
  15. void extrinsic(char *);
  16. void get_cmd(char *);
  17. void get_comspec(char *);
  18. int break_handler(void);
  19. int cls_cmd(void);
  20. int dos_cmd(void);
  21. int exit_cmd(void);
  22.  
  23. struct cmd_table
  24.        {
  25.         char *cmd_name;
  26.         int (*cmd_fxn)(void);
  27.        } commands[] = {"CLS",cls_cmd,"DOS",dos_cmd,"EXIT",exit_cmd};
  28.  
  29. static char com_spec[64];
  30.  
  31. main()
  32. {
  33.  char inp_buf[80];
  34.  
  35.  get_comspec(com_spec);
  36.  if (ssignal(SIGINT,break_handler) == SIG_ERR)
  37.  {
  38.   fputs("Can't capture ctrl-c interrupt",stderr);
  39.   exit(1);
  40.  }
  41.  while (1)
  42.  {
  43.   get_cmd(inp_buf);
  44.   if (!intrinsic(inp_buf))
  45.    extrinsic(inp_buf);
  46.  }
  47. }
  48.  
  49. int intrinsic(input_string)
  50. char *input_string;
  51. {
  52.  int i,j;
  53.  
  54.  while (*input_string == 0x20)
  55.   input_string++;
  56.  for (i = 0;i < dim(commands);i++)
  57.  {
  58.   j = strcmp(commands[i].cmd_name,input_string);
  59.   if (j == 0)
  60.   {
  61.    (*commands[i].cmd_fxn)();
  62.    return true;
  63.   }
  64.  }
  65.  return false;
  66. }
  67.  
  68. void extrinsic(input_string)
  69. char *input_string;
  70. {
  71.  if (system(input_string) != 0)
  72.   fputs("\nEXEC of COMMAND.COM failed\n",stderr);
  73. }
  74.  
  75. void get_cmd(buffer)
  76. char *buffer;
  77. {
  78.  printf("\nsh: ");
  79.  gets(buffer);
  80.  strupr(buffer);
  81. }
  82.  
  83. void get_comspec(buffer)
  84. char *buffer;
  85. {
  86.  strcpy(buffer,getenv("COMSPEC"));
  87.  if (buffer[0] == NULL)
  88.  {
  89.   fputs("\nNo COMSPEC variable in Environment\n",stderr);
  90.   exit(1);
  91.  }
  92. }
  93.  
  94. int break_handler(void)
  95. {
  96.  ssignal(SIGINT,break_handler);
  97.  printf("\nsh: ");
  98. }
  99.  
  100. int cls_cmd(void)
  101. {
  102.  printf("\033[2J");
  103. }
  104.  
  105. int dos_cmd(void)
  106. {
  107.  
  108.  if (spawnlp(P_WAIT,com_spec,com_spec,NULL) != 0)
  109.   fputs("\nEXEC of COMMAND.COM failed\n",stderr);
  110. }
  111.  
  112. int exit_cmd(void)
  113. {
  114.  exit(0);
  115. }